module TemplatesTypes where
import List

data MetaType = MetaTypeInteger | MetaTypeBoolean |MetaArrow MetaType MetaType | MetaUserDef String | MetaTypeUnknown
					deriving (Eq,Show)

type MetaProgram   = [MetaFunction]
 
data MetaFunction   =  MetaFunction String [MetaTreeExp]  
						deriving (Eq,Show)

					
data MetaExp =		   MetaInteger String 
					  |MetaBoolean String 
              		  |MetaVariable String 
              		  |MetaTypeConstructor String [MetaExp]
              		  |MetaApp    MetaExp MetaExp
              		  |MetaIf     MetaExp MetaExp MetaExp
              		  |MetaIfOnly MetaExp MetaExp 
              		  |MetaSkip
						deriving (Eq,Show)
						
data MetaTreeExp = 	 MetaNode (MetaExp, MetaType) [MetaTreeExp]  --CONTIENE UNA LISTA DE SUBNODOS MetaTreeExp
					|MetaLeaft MetaExp MetaProgram --Metaprogram es definiciones locales
						deriving (Eq,Show)
